home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 142
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin
/
tools
/
s44play
/
s44p101s.lzh
/
data.s
< prev
next >
Wrap
Text File
|
2000-01-24
|
19KB
|
791 lines
.include global.mac
;----------------------------------------------------------------
;データを読み込むための準備
;>d0.l:0=正常終了,負数=エラー
;>n-flag:mi=エラー
.text
.align 4,$2048
init_data::
moveq.l #0,d0
rts
;----------------------------------------------------------------
;データをオープンする
; データの種類に応じて次のワークを更新する
; data_timerd_count
; output_frequency
; data_frequency
; wave_data_flag
; mono_data_flag
; fmp_data_flag
; mono_play_flag
; 以下のワークは内部使用
; read_routine
; close_routine
; current_file_format
; data_format
; preconv_routine
;<current_param_ptr.l:パラメータバッファのアドレス
;>next_param_ptr.l:次のパラメータバッファのアドレス
;>d0.l:負数=エラー,0=データなし正常終了,その他=データあり
;>n-flag:mi=エラー
;>z-flag:eq=データなし正常終了
.text
.align 4,$2048
open_data::
movem.l d1-d2/a0,-(sp)
move.b output_timerd_count,d0
bpl 1f
move.l a0,-(sp)
lea.l (default_timerd_count_table_000,pc),a0
tst.b current_machine_num
beq @f
lea.l (default_timerd_count_table_030,pc),a0
@@: moveq.l #0,d0
move.b current_mpu_num,d0
move.b (a0,d0.l),d0
movea.l (sp)+,a0
1: move.b d0,data_timerd_count
move.b quality_level,d0
bpl 1f
move.l a0,-(sp)
lea.l (default_quality_table_000,pc),a0
tst.b current_machine_num
beq @f
lea.l (default_quality_table_030,pc),a0
@@: moveq.l #0,d0
move.b current_mpu_num,d0
move.b (a0,d0.l),d0
movea.l (sp)+,a0
1: move.b d0,data_quality
lea.l (dummy_rts,pc),a0
move.l a0,read_routine
move.l a0,close_routine
movea.l current_param_ptr,a2
move.w (pb_format,a2),current_file_format ;フォーマットの指定
move.l (pb_frequency,a2),current_file_frequency ;サンプリング周波数の指定
tst.b (pb_done,a2)
bne @f
move.l (pb_trktop_0,a2),(pb_trktop,a2)
move.l (pb_trkbtm_0,a2),(pb_trkbtm,a2)
move.l (pb_idxtop_0,a2),(pb_idxtop,a2)
move.l (pb_idxbtm_0,a2),(pb_idxbtm,a2)
move.l (pb_top_0,a2),(pb_top,a2)
move.l (pb_btm_0,a2),(pb_btm,a2)
@@:
tst.b (pb_is_cdxa,a2)
bne open_data_cdxa
movea.l (pb_ptr,a2),a0
tst.b (a0)
beq open_data_cdda ;ファイル名がないのでCDDA
;ファイル名
;ファイルまたはCDXA
open_data_file:
bsr open_file
bmi 99f ;エラー
beq 99f ;データなし正常終了
tst.b (pb_is_cdxa,a2)
bne open_data_cdxa ;CDXAだった
;ファイル
st.b (pb_done,a2)
move.l #read_file,read_routine
move.l #close_file,close_routine
move.l #get_restsize_file,get_restsize_routine
bra 50f
;トラック番号
;CDDA
open_data_cdda:
bsr open_cdda
bmi 99f ;エラー
beq 99f ;データなし正常終了
st.b (pb_done,a2)
move.l #read_cdda,read_routine
move.l #close_cdda,close_routine
move.l #get_restsize_cdda,get_restsize_routine
bra 50f
;ファイル名
;CDXA
open_data_cdxa:
bsr open_cdxa
bmi 99f ;エラー
beq 99f ;データなし正常終了
st.b (pb_done,a2)
move.l #read_cdxa,read_routine
move.l #close_cdxa,close_routine
move.l #get_restsize_cdxa,get_restsize_routine
bra 50f
;
;再生条件をまとめる
50: move.w data_format,d0
lea.l (wave_flag_table,pc),a0
move.b (a0,d0.w),wave_data_flag
lea.l (mono_data_table,pc),a0
move.b (a0,d0.w),mono_data_flag
lea.l (fmp_data_table,pc),a0
move.b (a0,d0.w),fmp_data_flag
lea.l (adpcm_data_table,pc),a0
move.b (a0,d0.w),adpcm_data_flag
lea.l (cdxa_data_table,pc),a0
move.b (a0,d0.w),cdxa_data_flag
lea.l (xx_data_table,pc),a0
move.b (a0,d0.w),xx_data_flag
st.b d0
tst.b mono_data_flag
bne 2f
cmpi.w #SFMP,data_format ;ステレオのFMPファイルはモノラルで再生できない
beq 1f
tst.b mono_flag
bne 2f
1: sf.b d0
2: move.b d0,mono_play_flag
;出力側のサンプリング周波数を求める
move.b data_timerd_count,d0
moveq.l #1,d1
tst.b mono_play_flag
bne @f
moveq.l #2,d1
@@: bsr timerd_count_to_frequency
move.l d0,output_frequency
;モノラルでサンプリング周波数の変換が発生しないときは,
;強制的にLow Qualityモードにする
tst.b mono_data_flag
beq 2f
tst.b mono_play_flag
beq 2f
move.l data_frequency,d0
cmp.l output_frequency,d0
bne 2f
move.b #LOW_QUALITY,data_quality
2:
.if 0
;ADPCMデータはHigh Qualityまで
tst.b adpcm_data_flag
beq 2f
moveq.l #HIGH_QUALITY,d0
cmp.b data_quality,d0
bhs 2f
move.b d0,data_quality
2:
.endif
;サンプリング周波数の変換方法とモノラル/ステレオの区別から,
;前処理ルーチンのアドレスを決定する
tst.b bass_flag
bne 10f
tst.b hicut_flag
bne 11f
;ノーマル
move.b data_quality,d0
bne 1f
lea.l (preconv_mono_play_table_lq,pc),a0
tst.b mono_play_flag
bne @f
lea.l (preconv_stereo_play_table_lq,pc),a0
@@: bra 2f
1: subq.b #1,d0
bne 1f
lea.l (preconv_mono_play_table_hq,pc),a0
tst.b mono_play_flag
bne @f
lea.l (preconv_stereo_play_table_hq,pc),a0
@@: bra 2f
1:
lea.l (preconv_mono_play_table_sq,pc),a0
tst.b mono_play_flag
bne @f
lea.l (preconv_stereo_play_table_sq,pc),a0
@@: bra 2f
2:
bra 20f
;バスブースターを使用する
10: move.b data_quality,d0
bne 1f
lea.l (preconv_bass_mono_play_table_lq,pc),a0
tst.b mono_play_flag
bne @f
lea.l (preconv_bass_stereo_play_table_lq,pc),a0
@@: bra 2f
1: subq.b #1,d0
bne 1f
lea.l (preconv_bass_mono_play_table_hq,pc),a0
tst.b mono_play_flag
bne @f
lea.l (preconv_bass_stereo_play_table_hq,pc),a0
@@: bra 2f
1:
lea.l (preconv_bass_mono_play_table_sq,pc),a0
tst.b mono_play_flag
bne @f
lea.l (preconv_bass_stereo_play_table_sq,pc),a0
@@: bra 2f
2:
bra 20f
;ハイカットフィルタを使用する
11: move.b data_quality,d0
bne 1f
lea.l (preconv_hicut_mono_play_table_lq,pc),a0
tst.b mono_play_flag
bne @f
lea.l (preconv_hicut_stereo_play_table_lq,pc),a0
@@: bra 2f
1: subq.b #1,d0
bne 1f
lea.l (preconv_hicut_mono_play_table_hq,pc),a0
tst.b mono_play_flag
bne @f
lea.l (preconv_hicut_stereo_play_table_hq,pc),a0
@@: bra 2f
1:
lea.l (preconv_hicut_mono_play_table_sq,pc),a0
tst.b mono_play_flag
bne @f
lea.l (preconv_hicut_stereo_play_table_sq,pc),a0
@@: bra 2f
2:
20:
move.w data_format,d0
add.w d0,d0
add.w d0,d0
move.l (a0,d0.w),preconv_routine
;入力データの1秒あたりのバイト数を求める
move.l data_frequency,d0 ;入力データのサンプリング周波数
move.w data_format,d1
lea.l (data_unit_table,pc),a0
move.b (a0,d1.w),d1 ;シフトカウント
bmi 1f
lsl.l d1,d0
bra 2f
1: neg.b d1
lsr.l d1,d0
2: move.l d0,data_tick_size ;入力データの1秒あたりのバイト数(過小評価)
;出力データの1秒あたりのバイト数を求める
move.l output_frequency,d0 ;出力データのサンプリング周波数
tst.b mono_play_flag
bne @f
add.l d0,d0 ;ステレオならば2倍
@@: move.l d0,output_tick_size ;出力データの1秒あたりのバイト数(過大評価)
;入力データよりも出力データのほうが大きいときは,
;読み込むサイズを調整する必要がある
move.l data_tick_size,d0 ;入力データの1秒あたりのバイト数(過小評価)
move.l output_tick_size,d1 ;出力データの1秒あたりのバイト数(過大評価)
moveq.l #0,d2
bra 2f
1: addq.b #1,d2
add.l d0,d0
2: cmp.l d1,d0
blo 1b
move.b d2,read_shift_count ;1度に読み込むデータの長さの右シフトカウント
moveq.l #1,d0 ;データあり
99: movem.l (sp)+,d1-d2/a0
rts
80: moveq.l #-1,d0
bra 99b
dummy_rts:
moveq.l #-1,d0
rts
;TIMERD_COUNTのデフォルト値のテーブル
default_timerd_count_table_000:: ;プラットフォームがX68000
.dc.b TIMERD_COUNT_000 ;X68000
.dc.b TIMERD_COUNT_000
.dc.b TIMERD_COUNT_030
.dc.b TIMERD_COUNT_030 ;Xellent30/VENUS-X
.dc.b TIMERD_COUNT_040 ;JUPITER-X
.dc.b 0
.dc.b TIMERD_COUNT_060 ;JUPITER-X
default_timerd_count_table_030:: ;プラットフォームがX68030
.dc.b TIMERD_COUNT_000
.dc.b TIMERD_COUNT_000
.dc.b TIMERD_COUNT_030
.dc.b TIMERD_COUNT_030 ;X68030
.dc.b TIMERD_COUNT_040 ;040turbo
.dc.b 0
.dc.b TIMERD_COUNT_060 ;060turbo
;再生品質のデフォルト値のテーブル
default_quality_table_000: ;プラットフォームがX68000
.dc.b DEFAULT_QUALITY_000 ;X68000
.dc.b DEFAULT_QUALITY_000
.dc.b DEFAULT_QUALITY_030
.dc.b DEFAULT_QUALITY_030 ;Xellent30/VENUS-X
.dc.b DEFAULT_QUALITY_040 ;JUPITER-X
.dc.b 0
.dc.b DEFAULT_QUALITY_060 ;JUPITER-X
default_quality_table_030: ;プラットフォームがX68030
.dc.b DEFAULT_QUALITY_000
.dc.b DEFAULT_QUALITY_000
.dc.b DEFAULT_QUALITY_030
.dc.b DEFAULT_QUALITY_030 ;X68030
.dc.b DEFAULT_QUALITY_040 ;040turbo
.dc.b 0
.dc.b DEFAULT_QUALITY_060 ;060turbo
.align 4
preconv_mono_play_table_lq:
.dc.l preconv_ss16b_mono_LQ
.dc.l preconv_ms16b_mono_LQ
.dc.l preconv_ss16l_mono_LQ
.dc.l preconv_ms16l_mono_LQ
.dc.l preconv_sfmp_mono_LQ
.dc.l preconv_mfmp_mono_LQ
.dc.l preconv_adpcm_LQ
.dc.l preconv_sxa4_mono_LQ
.dc.l preconv_mxa4_mono_LQ
.dc.l preconv_sxx4_mono_LQ
.dc.l preconv_mxx4_mono_LQ
.align 4
preconv_stereo_play_table_lq:
.dc.l preconv_ss16b_stereo_LQ
.dc.l preconv_ms16b_mono_LQ
.dc.l preconv_ss16l_stereo_LQ
.dc.l preconv_ms16l_mono_LQ
.dc.l preconv_sfmp_stereo_LQ
.dc.l preconv_mfmp_mono_LQ
.dc.l preconv_adpcm_LQ
.dc.l preconv_sxa4_stereo_LQ
.dc.l preconv_mxa4_mono_LQ
.dc.l preconv_sxx4_stereo_LQ
.dc.l preconv_mxx4_mono_LQ
.align 4
preconv_mono_play_table_hq:
.dc.l preconv_ss16b_mono_HQ
.dc.l preconv_ms16b_mono_HQ
.dc.l preconv_ss16l_mono_HQ
.dc.l preconv_ms16l_mono_HQ
.dc.l preconv_sfmp_mono_HQ
.dc.l preconv_mfmp_mono_HQ
.dc.l preconv_adpcm_HQ
.dc.l preconv_sxa4_mono_HQ
.dc.l preconv_mxa4_mono_HQ
.dc.l preconv_sxx4_mono_HQ
.dc.l preconv_mxx4_mono_HQ
.align 4
preconv_stereo_play_table_hq:
.dc.l preconv_ss16b_stereo_HQ
.dc.l preconv_ms16b_mono_HQ
.dc.l preconv_ss16l_stereo_HQ
.dc.l preconv_ms16l_mono_HQ
.dc.l preconv_sfmp_stereo_HQ
.dc.l preconv_mfmp_mono_HQ
.dc.l preconv_adpcm_HQ
.dc.l preconv_sxa4_stereo_HQ
.dc.l preconv_mxa4_mono_HQ
.dc.l preconv_sxx4_stereo_HQ
.dc.l preconv_mxx4_mono_HQ
.align 4
preconv_mono_play_table_sq:
.dc.l preconv_ss16b_mono_SQ
.dc.l preconv_ms16b_mono_SQ
.dc.l preconv_ss16l_mono_SQ
.dc.l preconv_ms16l_mono_SQ
.dc.l preconv_sfmp_mono_SQ
.dc.l preconv_mfmp_mono_SQ
.dc.l preconv_adpcm_SQ
.dc.l preconv_sxa4_mono_SQ
.dc.l preconv_mxa4_mono_SQ
.dc.l preconv_sxx4_mono_SQ
.dc.l preconv_mxx4_mono_SQ
.align 4
preconv_stereo_play_table_sq:
.dc.l preconv_ss16b_stereo_SQ
.dc.l preconv_ms16b_mono_SQ
.dc.l preconv_ss16l_stereo_SQ
.dc.l preconv_ms16l_mono_SQ
.dc.l preconv_sfmp_stereo_SQ
.dc.l preconv_mfmp_mono_SQ
.dc.l preconv_adpcm_SQ
.dc.l preconv_sxa4_stereo_SQ
.dc.l preconv_mxa4_mono_SQ
.dc.l preconv_sxx4_stereo_SQ
.dc.l preconv_mxx4_mono_SQ
.align 4
preconv_bass_mono_play_table_lq:
.dc.l preconv_bass_ss16b_mono_LQ
.dc.l preconv_bass_ms16b_mono_LQ
.dc.l preconv_bass_ss16l_mono_LQ
.dc.l preconv_bass_ms16l_mono_LQ
.dc.l preconv_sfmp_mono_LQ
.dc.l preconv_mfmp_mono_LQ
.dc.l preconv_adpcm_LQ
.dc.l preconv_sxa4_mono_LQ
.dc.l preconv_mxa4_mono_LQ
.dc.l preconv_sxx4_mono_LQ
.dc.l preconv_mxx4_mono_LQ
.align 4
preconv_bass_stereo_play_table_lq:
.dc.l preconv_bass_ss16b_stereo_LQ
.dc.l preconv_bass_ms16b_mono_LQ
.dc.l preconv_bass_ss16l_stereo_LQ
.dc.l preconv_bass_ms16l_mono_LQ
.dc.l preconv_sfmp_stereo_LQ
.dc.l preconv_mfmp_mono_LQ
.dc.l preconv_adpcm_LQ
.dc.l preconv_sxa4_stereo_LQ
.dc.l preconv_mxa4_mono_LQ
.dc.l preconv_sxx4_stereo_LQ
.dc.l preconv_mxx4_mono_LQ
.align 4
preconv_bass_mono_play_table_hq:
.dc.l preconv_bass_ss16b_mono_HQ
.dc.l preconv_bass_ms16b_mono_HQ
.dc.l preconv_bass_ss16l_mono_HQ
.dc.l preconv_bass_ms16l_mono_HQ
.dc.l preconv_sfmp_mono_HQ
.dc.l preconv_mfmp_mono_HQ
.dc.l preconv_adpcm_HQ
.dc.l preconv_sxa4_mono_HQ
.dc.l preconv_mxa4_mono_HQ
.dc.l preconv_sxx4_mono_HQ
.dc.l preconv_mxx4_mono_HQ
.align 4
preconv_bass_stereo_play_table_hq:
.dc.l preconv_bass_ss16b_stereo_HQ
.dc.l preconv_bass_ms16b_mono_HQ
.dc.l preconv_bass_ss16l_stereo_HQ
.dc.l preconv_bass_ms16l_mono_HQ
.dc.l preconv_sfmp_stereo_HQ
.dc.l preconv_mfmp_mono_HQ
.dc.l preconv_adpcm_HQ
.dc.l preconv_sxa4_stereo_HQ
.dc.l preconv_mxa4_mono_HQ
.dc.l preconv_sxx4_stereo_HQ
.dc.l preconv_mxx4_mono_HQ
.align 4
preconv_bass_mono_play_table_sq:
.dc.l preconv_bass_ss16b_mono_SQ
.dc.l preconv_bass_ms16b_mono_SQ
.dc.l preconv_bass_ss16l_mono_SQ
.dc.l preconv_bass_ms16l_mono_SQ
.dc.l preconv_sfmp_mono_SQ
.dc.l preconv_mfmp_mono_SQ
.dc.l preconv_adpcm_SQ
.dc.l preconv_sxa4_mono_SQ
.dc.l preconv_mxa4_mono_SQ
.dc.l preconv_sxx4_mono_SQ
.dc.l preconv_mxx4_mono_SQ
.align 4
preconv_bass_stereo_play_table_sq:
.dc.l preconv_bass_ss16b_stereo_SQ
.dc.l preconv_bass_ms16b_mono_SQ
.dc.l preconv_bass_ss16l_stereo_SQ
.dc.l preconv_bass_ms16l_mono_SQ
.dc.l preconv_sfmp_stereo_SQ
.dc.l preconv_mfmp_mono_SQ
.dc.l preconv_adpcm_SQ
.dc.l preconv_sxa4_stereo_SQ
.dc.l preconv_mxa4_mono_SQ
.dc.l preconv_sxx4_stereo_SQ
.dc.l preconv_mxx4_mono_SQ
.align 4
preconv_hicut_mono_play_table_lq:
.dc.l preconv_hicut_ss16b_mono_LQ
.dc.l preconv_hicut_ms16b_mono_LQ
.dc.l preconv_hicut_ss16l_mono_LQ
.dc.l preconv_hicut_ms16l_mono_LQ
.dc.l preconv_sfmp_mono_LQ
.dc.l preconv_mfmp_mono_LQ
.dc.l preconv_adpcm_LQ
.dc.l preconv_sxa4_mono_LQ
.dc.l preconv_mxa4_mono_LQ
.dc.l preconv_sxx4_mono_LQ
.dc.l preconv_mxx4_mono_LQ
.align 4
preconv_hicut_stereo_play_table_lq:
.dc.l preconv_hicut_ss16b_stereo_LQ
.dc.l preconv_hicut_ms16b_mono_LQ
.dc.l preconv_hicut_ss16l_stereo_LQ
.dc.l preconv_hicut_ms16l_mono_LQ
.dc.l preconv_sfmp_stereo_LQ
.dc.l preconv_mfmp_mono_LQ
.dc.l preconv_adpcm_LQ
.dc.l preconv_sxa4_stereo_LQ
.dc.l preconv_mxa4_mono_LQ
.dc.l preconv_sxx4_stereo_LQ
.dc.l preconv_mxx4_mono_LQ
.align 4
preconv_hicut_mono_play_table_hq:
.dc.l preconv_hicut_ss16b_mono_HQ
.dc.l preconv_hicut_ms16b_mono_HQ
.dc.l preconv_hicut_ss16l_mono_HQ
.dc.l preconv_hicut_ms16l_mono_HQ
.dc.l preconv_sfmp_mono_HQ
.dc.l preconv_mfmp_mono_HQ
.dc.l preconv_adpcm_HQ
.dc.l preconv_sxa4_mono_HQ
.dc.l preconv_mxa4_mono_HQ
.dc.l preconv_sxx4_mono_HQ
.dc.l preconv_mxx4_mono_HQ
.align 4
preconv_hicut_stereo_play_table_hq:
.dc.l preconv_hicut_ss16b_stereo_HQ
.dc.l preconv_hicut_ms16b_mono_HQ
.dc.l preconv_hicut_ss16l_stereo_HQ
.dc.l preconv_hicut_ms16l_mono_HQ
.dc.l preconv_sfmp_stereo_HQ
.dc.l preconv_mfmp_mono_HQ
.dc.l preconv_adpcm_HQ
.dc.l preconv_sxa4_stereo_HQ
.dc.l preconv_mxa4_mono_HQ
.dc.l preconv_sxx4_stereo_HQ
.dc.l preconv_mxx4_mono_HQ
.align 4
preconv_hicut_mono_play_table_sq:
.dc.l preconv_hicut_ss16b_mono_SQ
.dc.l preconv_hicut_ms16b_mono_SQ
.dc.l preconv_hicut_ss16l_mono_SQ
.dc.l preconv_hicut_ms16l_mono_SQ
.dc.l preconv_sfmp_mono_SQ
.dc.l preconv_mfmp_mono_SQ
.dc.l preconv_adpcm_SQ
.dc.l preconv_sxa4_mono_SQ
.dc.l preconv_mxa4_mono_SQ
.dc.l preconv_sxx4_mono_SQ
.dc.l preconv_mxx4_mono_SQ
.align 4
preconv_hicut_stereo_play_table_sq:
.dc.l preconv_hicut_ss16b_stereo_SQ
.dc.l preconv_hicut_ms16b_mono_SQ
.dc.l preconv_hicut_ss16l_stereo_SQ
.dc.l preconv_hicut_ms16l_mono_SQ
.dc.l preconv_sfmp_stereo_SQ
.dc.l preconv_mfmp_mono_SQ
.dc.l preconv_adpcm_SQ
.dc.l preconv_sxa4_stereo_SQ
.dc.l preconv_mxa4_mono_SQ
.dc.l preconv_sxx4_stereo_SQ
.dc.l preconv_mxx4_mono_SQ
wave_flag_table:
.dc.b 0 ;SS16B
.dc.b 0 ;MS16B
.dc.b -1 ;SS16L
.dc.b -1 ;MS16L
.dc.b 0 ;SFMP
.dc.b 0 ;MFMP
.dc.b 0 ;ADPCM
.dc.b 0 ;SXA4
.dc.b 0 ;MXA4
.dc.b 0 ;SXX4
.dc.b 0 ;MXX4
mono_data_table:
.dc.b 0 ;SS16B
.dc.b -1 ;MS16B
.dc.b 0 ;SS16L
.dc.b -1 ;MS16L
.dc.b 0 ;SFMP
.dc.b -1 ;MFMP
.dc.b -1 ;ADPCM
.dc.b 0 ;SXA4
.dc.b -1 ;MXA4
.dc.b 0 ;SXX4
.dc.b -1 ;MXX4
fmp_data_table:
.dc.b 0 ;SS16B
.dc.b 0 ;MS16B
.dc.b 0 ;SS16L
.dc.b 0 ;MS16L
.dc.b -1 ;SFMP
.dc.b -1 ;MFMP
.dc.b 0 ;ADPCM
.dc.b 0 ;SXA4
.dc.b 0 ;MXA4
.dc.b 0 ;SXX4
.dc.b 0 ;MXX4
adpcm_data_table:
.dc.b 0 ;SS16B
.dc.b 0 ;MS16B
.dc.b 0 ;SS16L
.dc.b 0 ;MS16L
.dc.b 0 ;SFMP
.dc.b 0 ;MFMP
.dc.b -1 ;ADPCM
.dc.b 0 ;SXA4
.dc.b 0 ;MXA4
.dc.b 0 ;SXX4
.dc.b 0 ;MXX4
cdxa_data_table:
.dc.b 0 ;SS16B
.dc.b 0 ;MS16B
.dc.b 0 ;SS16L
.dc.b 0 ;MS16L
.dc.b 0 ;SFMP
.dc.b 0 ;MFMP
.dc.b 0 ;ADPCM
.dc.b -1 ;SXA4
.dc.b -1 ;MXA4
.dc.b 0 ;SXX4
.dc.b 0 ;MXX4
xx_data_table:
.dc.b 0 ;SS16B
.dc.b 0 ;MS16B
.dc.b 0 ;SS16L
.dc.b 0 ;MS16L
.dc.b 0 ;SFMP
.dc.b 0 ;MFMP
.dc.b 0 ;ADPCM
.dc.b 0 ;SXA4
.dc.b 0 ;MXA4
.dc.b -1 ;SXX4
.dc.b -1 ;MXX4
;1サンプリングあたりのデータ長のシフトカウント
; (入力側は過小評価,出力側は過大評価)
data_unit_table:
.dc.b 2 ;SS16B(×4)
.dc.b 1 ;MS16B(×2)
.dc.b 2 ;SS16L(×4)
.dc.b 1 ;MS16L(×2)
.dc.b 1 ;SFMP(×2)
.dc.b 0 ;MFMP(×1)
.dc.b -1 ;ADPCM(×0.5)
.dc.b 0 ;SXA4(×1)
.dc.b -1 ;MXA4(×0.5)
.dc.b 0 ;SXX4(×1)
.dc.b -1 ;MXX4(×0.5)
.even
.data
.align 4
read_routine: .dc.l dummy_rts
preconv_routine:: .dc.l dummy_rts
close_routine: .dc.l dummy_rts
get_restsize_routine: .dc.l dummy_rts
mono_data_flag:: .dc.b 0 ;-1=モノラルデータ
wave_data_flag:: .dc.b 0 ;-1=WAVEデータ(little-endian)
fmp_data_flag:: .dc.b 0 ;-1=FMPデータ
adpcm_data_flag:: .dc.b 0 ;-1=ADPCMデータ
cdxa_data_flag:: .dc.b 0 ;-1=CDXAデータ
xx_data_flag:: .dc.b 0 ;-1=xxデータ
mono_play_flag:: .dc.b 0 ;-1=モノラル再生
.bss
.even
current_file_format:: .ds.w 1 ;パラメータで指定されたフォーマット
.align 4
current_file_frequency:: .ds.l 1 ;パラメータで指定されたサンプリング周波数
.even
data_format:: .ds.w 1 ;データの実際のフォーマット
.align 4
output_frequency:: .ds.l 1 ;出力側のサンプリング周波数(Hz)
data_frequency:: .ds.l 1 ;データのサンプリング周波数(Hz)
data_timerd_count:: .ds.b 1 ;TIMERD割り込み間隔(μs)
data_quality:: .ds.b 1 ;再生品質
; 0=符号が変わってもチャンネル遷移しない
; 1=符号が変わったらチャンネル遷移する
; 周波数変換は重複・間引き
; 2=符号が変わったらチャンネル遷移する
; 周波数変換は面積補間
.align 4
data_tick_size: .ds.l 1 ;入力データの1秒あたりのバイト数(過小評価)
output_tick_size: .ds.l 1 ;出力データの1秒あたりのバイト数(過大評価)
read_shift_count:: .ds.b 1 ;1度に読み込むデータの長さの右シフトカウント
;----------------------------------------------------------------
;データを読み込む
;<a0.l:出力バッファの先頭
;<a1.l:入力バッファの先頭
;>d0.l:データのサイズ,0=終了,-1=エラー
;>n-flag:mi=エラー
;>z-flag:eq=終了
.text
.align 4,$2048
read_data::
movem.l a0-a2,-(sp)
bsr break_kill
movea.l read_routine,a2
jsr (a2)
bsr break_load
movem.l (sp)+,a0-a2
tst.l d0 ;0なら終了
rts
;----------------------------------------------------------------
;データをクローズする
.text
.align 4,$2048
close_data::
move.l a1,-(sp)
movea.l close_routine,a1
jsr (a1)
lea.l (dummy_rts,pc),a1
move.l a1,read_routine
move.l a1,close_routine
movea.l (sp)+,a1
tst.l d0
rts
;----------------------------------------------------------------
;データの残りバイト数を得る
.text
.align 4,$2048
get_restsize_data::
move.l a1,-(sp)
movea.l get_restsize_routine,a1
jsr (a1)
movea.l (sp)+,a1
tst.l d0
rts